home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / language / gemfsc18.lzh / AESSRC18.LZH / AESFUNCS / OBJTHERM.C < prev    next >
C/C++ Source or Header  |  1992-04-07  |  5KB  |  180 lines

  1. /**************************************************************************
  2.  * 
  3.  *************************************************************************/
  4.  
  5. #include "gemfast.h"
  6.  
  7. #ifndef NULL
  8.   #define NULL 0L
  9. #endif
  10.  
  11. #define EXTEND_INTERIOR 0x8000
  12.  
  13. typedef struct {
  14.     XUSERBLK xub;
  15.     int      tick_limit;
  16.     int      tick_count;
  17.     int      tick_width;
  18.     int      curr_width;
  19.     int      full_width;
  20.     int      fill_style;
  21.     int      xoffset;
  22. } ThermoInfo;
  23.  
  24. static long draw_thermo(pb)
  25.     register XPARMBLK   *pb;
  26. {
  27.     register ThermoInfo *pt = (ThermoInfo *)pb->pub;
  28.     register int         vdi_handle;
  29.     register int         fillwidth;
  30.     VRECT                cliprect;
  31.     VRECT                boxrect;
  32.     GRECT                objrect;
  33.  
  34.     if (0 == (vdi_handle = apl_vshared())) {
  35.         return 0;
  36.     }
  37.     
  38.     fillwidth = pt->tick_count * pt->tick_width;
  39.     if (fillwidth > pt->full_width) {
  40.         fillwidth = pt->full_width;
  41.     }
  42.  
  43.     rc_copy(&pb->drawrect, &objrect);
  44.     objrect.g_x += pt->xoffset;
  45.     objrect.g_w  = pt->full_width;
  46.     
  47.     rc_gtov(&objrect, &boxrect);
  48.     rc_vadjust(&boxrect, 1, 1);
  49.     
  50.     if (pt->fill_style & EXTEND_INTERIOR) {
  51.         objrect.g_x += pt->curr_width - 1;
  52.         rc_intersect(&pb->cliprect, &objrect);
  53.         rc_gtov(&objrect, &cliprect);
  54.         vs_clip(vdi_handle, 1, &cliprect);
  55.     } else {
  56.         rc_gtov(&pb->cliprect, &cliprect);
  57.         vs_clip(vdi_handle, 1, &cliprect);
  58.         vsf_interior(vdi_handle, IS_HOLLOW);
  59.         v_bar(vdi_handle, &boxrect);
  60.     }
  61.     
  62.     boxrect.v_x2 = boxrect.v_x1 + fillwidth;
  63.  
  64.     vsf_interior(vdi_handle, IS_PATTERN);
  65.     vsf_style(vdi_handle, pt->fill_style & 0x0007);
  66.     v_bar(vdi_handle, &boxrect);
  67.     vsf_style(vdi_handle, IP_SOLID);
  68.     vsf_interior(vdi_handle, IS_SOLID);
  69.  
  70.     vs_clip(vdi_handle, 0, &cliprect);
  71.     
  72.     pt->curr_width = fillwidth;
  73.     
  74.     return 0;
  75.  
  76. }
  77.  
  78. int obj_mkthermo(ptree, object, nincr)
  79.     OBJECT          *ptree;
  80.     register int     object;
  81.     register int     nincr;
  82. {
  83.     register int          iwidth;
  84.     register OBJECT      *pobj = &ptree[object];
  85.     register ThermoInfo  *pt;
  86.     
  87. /*-------------------------------------------------------------------------
  88.  * Check for zero increments to prevent div-by-zero errors.
  89.  * Calc the pixel width of one increment.
  90.  * Make sure a VDI workstation is available for later.
  91.  *-----------------------------------------------------------------------*/
  92.     
  93.     if (0 >= nincr) 
  94.         return -1;
  95.  
  96.     if (0 == (iwidth = pobj->ob_width / nincr))
  97.         return -64;
  98.  
  99.     if (0 == apl_vshared()) {
  100.         return -35;
  101.     }
  102.  
  103. /*-------------------------------------------------------------------------
  104.  * If the object has already been made into a G_THERMO extended object,
  105.  * just get its pointer, else make it into such an object.
  106.  *-----------------------------------------------------------------------*/
  107.  
  108.     if ((pobj->ob_type & 0x00FF) == G_USERDEF) {
  109.         pt = (ThermoInfo *)pobj->ob_spec;
  110.         if (pt->xub.ob_type != G_THERMO) {
  111.             return -1;
  112.         }
  113.     } else {
  114.         if (NULL == (pt = apl_malloc((long)sizeof(*pt)))) {
  115.             return -39;
  116.         }
  117.         obj_mxuserder(&pt->xub, pobj, draw_thermo);
  118.         pt->xub.ub_size = sizeof(*pt);
  119.         pt->xub.ob_type = G_THERMO;
  120.     }
  121.  
  122. /*-------------------------------------------------------------------------
  123.  *-----------------------------------------------------------------------*/
  124.     
  125.     pt->curr_width = 0;
  126.     pt->tick_limit = nincr;
  127.     pt->tick_count = 0;
  128.     pt->tick_width = iwidth;
  129.     pt->full_width = nincr * iwidth;
  130.     pt->xoffset    = (pobj->ob_width - pt->full_width) / 2;
  131.     pt->fill_style = (pt->xub.ob_spec >> 4) & 0x0007;
  132.     
  133.     return 0;
  134.     
  135. }
  136.  
  137. int obj_udthermo(ptree, object, newpos, pclip)
  138.     OBJECT *ptree;
  139.     int     object;
  140.     int     newpos;
  141.     GRECT  *pclip;
  142. {
  143.     register ThermoInfo *pt = (ThermoInfo *)ptree[object].ob_spec;
  144.     int                 oldpos;
  145.     
  146.     if ((ptree[object].ob_type & 0x00FF) != G_USERDEF
  147.      || pt->xub.ob_type != G_THERMO) {
  148.         return 0;
  149.     }
  150.  
  151.     oldpos = pt->tick_count;    
  152.  
  153.     if (newpos == OBJ_TINQUIRE) {
  154.         return oldpos;
  155.     } else if (newpos < 0) {
  156.         newpos = pt->tick_count + 1;
  157.     }
  158.     
  159.     if (newpos > pt->tick_limit) {
  160.         newpos = pt->tick_limit;
  161.     }
  162.     
  163.     if (oldpos == newpos) {
  164.         return oldpos;
  165.     }
  166.     
  167.     pt->tick_count = newpos;
  168.  
  169.     if (pclip != NULL) {
  170.         if (oldpos < newpos) {
  171.             pt->fill_style |= EXTEND_INTERIOR;
  172.         }
  173.         objc_draw(ptree, object, MAX_DEPTH, *pclip);
  174.         pt->fill_style &= ~EXTEND_INTERIOR;
  175.     }
  176.     
  177.     return oldpos;
  178. }
  179.  
  180.